home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Updates / Datatypes / RGFX-DT35 / Source / libbase.c < prev    next >
C/C++ Source or Header  |  1999-11-14  |  4KB  |  201 lines

  1. #include <clib/alib_protos.h>
  2. #include <pragma/exec_lib.h>
  3. #include <pragma/intuition_lib.h>
  4. #include <dos/dos.h>
  5. #include <exec/resident.h>
  6. #include "class.h"
  7.  
  8. #define VERSION 44
  9. #define REVISION 0
  10.  
  11. struct ClassBase:Library
  12. {
  13. BPTR cb_SegList;
  14. IClass *cb_Class;
  15. SignalSemaphore cb_Lock;
  16. };
  17.  
  18. extern APTR Dispatcher;
  19. extern ULONG InitTab[];
  20. extern APTR LibVectors[];
  21. extern char LibName[];
  22. extern char LibId[];
  23.  
  24. ClassBase *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase);
  25. ClassBase *LibOpen(register __a6 ClassBase *cb);
  26. ULONG LibClose(register __a6 ClassBase *cb);
  27. ULONG LibExpunge(register __a6 ClassBase *cb);
  28. IClass *ObtainClass(register __a6 ClassBase *cb);
  29.  
  30. BOOL L_OpenLibs();
  31. void L_CloseLibs();
  32. IClass *InitClass(ClassBase *cb);
  33.  
  34. static LONG LibExtFunc()
  35. {
  36. return -1;
  37. }
  38.  
  39. static Resident RomTag=
  40. {
  41. RTC_MATCHWORD,
  42. &RomTag,
  43. &RomTag+sizeof(RomTag),
  44. RTF_AUTOINIT,
  45. VERSION,
  46. NT_LIBRARY,
  47. 0,
  48. LibName,
  49. LibId,
  50. &InitTab
  51. };
  52.  
  53. char LibName[]="rgfx.datatype";
  54. char LibId[]="$VER:rgfx.datatype 44.0 (13.11.99) © 1997-99 by Achim Stegemann\n";
  55.  
  56. APTR LibVectors[]=
  57. {
  58. LibOpen,
  59. LibClose,
  60. LibExpunge,
  61. LibExtFunc,
  62. ObtainClass,
  63. APTR(-1),
  64. };
  65.  
  66. ULONG InitTab[]=
  67. {
  68. sizeof(ClassBase),
  69. ULONG(LibVectors),
  70. 0,
  71. ULONG(LibInit)
  72. };
  73.  
  74. Library *SysBase;
  75. Library *DOSBase;
  76. Library *IntuitionBase;
  77. Library *GfxBase;
  78. Library *UtilityBase;
  79. Library *IFFParseBase;
  80. Library *XpkBase;
  81. Library *DataTypesBase;
  82. Library *SuperClassBase;
  83. Library *CyberGfxBase;
  84.  
  85. ClassBase *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase)
  86. {
  87. SysBase=sysbase;
  88. cb->lib_Revision=REVISION;
  89. cb->cb_SegList=Segment;
  90. InitSemaphore(&cb->cb_Lock);
  91. return cb;
  92. }
  93.  
  94. ClassBase *LibOpen(register __a6 ClassBase *cb)
  95. {
  96. ClassBase *ret=0;
  97. cb->lib_Flags&=~LIBF_DELEXP;
  98. ObtainSemaphore(&cb->cb_Lock);
  99. if(!cb->cb_Class)
  100.     {
  101.     if(L_OpenLibs())
  102.         {
  103.         if(cb->cb_Class=InitClass(cb)) ret=cb;
  104.         }
  105.     }
  106. else ret=cb;
  107. if(ret) cb->lib_OpenCnt++;
  108. ReleaseSemaphore(&cb->cb_Lock);
  109. return ret;
  110. }
  111.  
  112. ULONG LibClose(register __a6 ClassBase *cb)
  113. {
  114. if(cb->lib_OpenCnt) cb->lib_OpenCnt--;
  115. return (!cb->lib_OpenCnt&&cb->lib_Flags&LIBF_DELEXP)?LibExpunge(cb):0;
  116. }
  117.  
  118. ULONG LibExpunge(register __a6 ClassBase *cb)
  119. {
  120. if(!cb->lib_OpenCnt)
  121.     {
  122.     if(cb->cb_Class) 
  123.         {
  124.         if(!FreeClass(cb->cb_Class))
  125.             {
  126.             AddClass(cb->cb_Class);
  127.             return 0;
  128.             }
  129.         }
  130.     L_CloseLibs();
  131.     Remove(cb);
  132.     FreeMem((BYTE *)cb-cb->lib_NegSize,cb->lib_NegSize+cb->lib_PosSize);
  133.     return cb->cb_SegList;
  134.     }
  135. else cb->lib_Flags|=LIBF_DELEXP;
  136. return 0;
  137. }
  138.  
  139. IClass *InitClass(ClassBase *cb)
  140. {
  141. IClass *cl;
  142. if(cl=MakeClass(LibName,"picture.datatype",0,sizeof(Data),0))
  143.     {
  144.     cl->h_Entry=&HookEntry;
  145.     cl->h_SubEntry=&Dispatcher;
  146.     cl->cl_UserData=ULONG(cb);
  147.     AddClass(cl);
  148.     }
  149. return cl;
  150. }
  151.  
  152. BOOL L_OpenLibs()
  153. {
  154. if(DOSBase=OpenLibrary("dos.library",40))
  155.     {
  156.     if(GfxBase=OpenLibrary("graphics.library",40))
  157.         {
  158.         if(IntuitionBase=OpenLibrary("intuition.library",40))
  159.             {
  160.             if(UtilityBase=OpenLibrary("utility.library",40))
  161.                 {
  162.                 if(IFFParseBase=OpenLibrary("iffparse.library",40))
  163.                     {
  164.                     if(DataTypesBase=OpenLibrary("datatypes.library",44))
  165.                         {
  166.                         if(SuperClassBase=OpenLibrary("datatypes/picture.datatype",44))
  167.                             {
  168.                             if(XpkBase=OpenLibrary("xpkmaster.library",5))
  169.                                 {
  170.                                 CyberGfxBase=OpenLibrary("cybergraphics.library",40);
  171.                                 return 1;
  172.                                 }
  173.                             }
  174.                         }
  175.                     }
  176.                 }
  177.             }
  178.         }
  179.     }
  180. L_CloseLibs();
  181. return 0;
  182. }
  183.  
  184. void L_CloseLibs()
  185. {
  186. CloseLibrary(DOSBase);
  187. CloseLibrary(IntuitionBase);
  188. CloseLibrary(GfxBase);
  189. CloseLibrary(UtilityBase);
  190. CloseLibrary(IFFParseBase);
  191. CloseLibrary(DataTypesBase);
  192. CloseLibrary(SuperClassBase);
  193. CloseLibrary(XpkBase);
  194. }
  195.  
  196. IClass *ObtainClass(register __a6 ClassBase *cb)
  197. {
  198. return cb->cb_Class;
  199. }
  200.  
  201.